﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using ConfigCreate;

namespace ConfigModel
{
    public class ConfigData : ICheckParameters, IPreCompletion
    {
        
        [CreateRolePermissionHeader("管理员", PermissionType = RolePermissionType.UnEnabled)] //设置大类别的权限角色，非此角色表现为不可编辑
        [CreateDatePicker("进阶设置", "搜索", "起始日期")] //日期选择框控件
        public DateTime StartDate { get; set; } = DateTime.Now.AddDays(-1);

        [CreateDatePicker("进阶设置", "搜索", "结束日期")] //日期选择框控件
        public DateTime? EndDate { get; set; }

        [CreateDateTimePicker("进阶设置", "搜索", "中间时间")] //日期时间控件
        public DateTime? SelectTime { get; set; } = DateTime.Now;

        [CreateVisibilityGroup(VisionType.Three, CheckGroupName = "搜索")] //控制“搜索”组的可见性，当此值包含【VisionType.One和VisionType.Three】中任一个，“搜索”组可见
        [CreateVisibilityGroup(VisionType.One, CheckGroupName = "搜索")]
        [CreateMultipleComboBox("进阶设置", "算法", "使用算法", GroupIndex = 0)] //多选下拉框控件
        public List<VisionType> VisionTypes { get; set; } = new List<VisionType>() { VisionType.One };

        [CreateOpenFile("进阶设置", "算法", "脚本路径")] //文件选择框控件
        public string ScriptPath { get; set; }

        //文件保存对话框控件
        [CreateSaveFile("进阶设置", "算法", "结果位置", IsReadonly = true, DialogTitle = "请选择要保存的文件", DialogFilter = "Docx文档|*.docx|所有文件|*.*")]
        public string ResultPath { get; set; }

        [CreateOpenFolder("进阶设置", "算法", "日志目录", Necessary = true)] //目录选择对话框控件
        public string LogPath { get; set; } = "E:\\";

        [CreateTextBox("基本设置", "数据库", "数据库连接", Necessary = true, HeaderIndex = 0)] //文本框控件，并设置大类别索引为0
        public string DBServer { get; } = "127.0.0.1";

        //下拉选择框控件
        [CreateComboBox("基本设置", "数据库", "数据库类型", Necessary = true, Remark = "可设置数据库的类型, 包括MySQL和SqlServer, 请选择正确的数据库类型")]
        public DBType DBType { get; set; }

        [CreateVisibilityPanel("AutoConnect", true, RelevanceGroupName = "服务器")] //受【服务器-AutoConnect】的控件所控制，当AutoConnect的值为true时显示，RelevanceGroupName表示跨组设置
        [CreateNumeric("基本设置", "数据库", "超时时间", MaxValue = 60000, MinValue = 100)] //数字框控件
        public int DBTimeOut { get; set; } = 1000;

        [CreateEditNotificationPanel(Definition = "服务器IP地址")] //设置该属性变动会通过SaveParametersChange事件推送（重要参数添加此设置）
        [CreateIpAddressTextBox("基本设置", "服务器", "服务器地址")] //IP地址控件
        public string TCPServer { get; set; } = "192.168.1.102";

        [CreateNumeric("基本设置", "服务器", "端口")] //数字框控件
        public int Port { get; set; } = 8080;


        [CreateToggleButton("基本设置", "服务器", "自动连接")] //切换控件,上面的DBTimeOut属性对应的控件因为添加了CreateVisibilityPanel特性，受此属性控件
        public bool AutoConnect { get; set; } = true;

        [CreateIgnoreSaveConfig] //添加此特性后，该属性值不会保存到配置文件中，还原也不会（像密码这类特殊的可以设置该特性，防止把用户输入的密码保存到配置文件中）
        [CreatePasswordBox("基本设置", "服务器", "验证密码")] //密码框控件
        public string Password { get; set; } = "1234";

        [CreateBindingPanel("BindingList")] //该生成的控件支持绑定框，并设置绑定列表对象（绑定对象为属性）
        [CreateTextBox("基本设置", "服务器", "我的文本")] //文本框控件
        public string MyTest { get; set; }

        [CreateRolePermissionGroup("管理员", PermissionType = RolePermissionType.UnEnabled)] //设置角色权限，非【管理员】角色，该组为不可用状态
        [CreateTextBox("基本设置", "", "第一项")] //文本框控件
        public string Test1 { get; set; }

        [CreateNumeric("基本设置", "", "第二项", MinValue = 100, MaxValue = 150)] //数字框控件
        public int Num2 { get; set; }

        [CreateNumeric("基本设置", "", "第三项", MinValue = 0, MaxValue = 100, Increment = 0.1d, Places = 2)] //数字框控件
        public double Num3 { get; set; }

        [CreateRolePermissionConrol("管理员")] //设置触角权限，非【管理员 和 主管】，该控件不可见
        [CreateRolePermissionConrol("主管")]
        [CreateIpAddressTextBox("基本设置", "测试权限", "第四项")] //IP地址控件
        public string IP4 { get; set; }

        [CreateTextBlock("进阶设置", "其它", FontSize = 20, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, ForegroundColor = "Red")]
        public string MyLabel { get; set; } = "这是一个标签";

        [CreateCustomControl("进阶设置","其它")]
        public ConfigModel.ViewModel.MyUControlModel MyUControlModel { get; set; } = new ViewModel.MyUControlModel();

        public List<BindingData> BindingList { get; set; } //被绑定的列表

        public TestData TData { get; set; } //二级对象，该属性没有添加特性，它里面的属性也可以被创建控件

        //继承ICheckParameters接口,当配置框被点击“确定”时会被调用作为检测用，此特性必须放在返回string的没参数函数中，函数返回非空字符表示检查不通过并返回对应错误信息，此函数可以进行多个属性值的详细检测，例如下面例子就表示Port的值不能为9000，也可以添加某个属性的值不能小于某个属性值之类的检查
        public string CheckParametersValid()
        {
            if (Port == 9000)
                return "端口不能为9000";
            return string.Empty;
        }

        public void Completion()
        {
            Debug.WriteLine("这是确定完成前最后调用函数，可以做一些转换或保存操作");
        }
    }

    public class TestData : ICheckParameters
    {
        [CreateTextBox("第三设置", "测试组", "测试1")]
        public string Test1 { get; set; }

        [CreateTextBox("第三设置", "测试组", "测试2", IsMultiline = true, Height = 120)]
        public string Test2 { get; set; }

        public string CheckParametersValid()
        {
            if (Test1 == "123")
                return "测试1的值不能为123";
            return null;
        }
    }

    //枚举，对应生成下拉框，如果子项不添加【ComboBoxItemName】特性，就显示原本内容
    public enum DBType
    {
        MySQL,
        SqlServer
    }

    //枚举，子项添加了【ComboBoxItemName】特性，内容显示对应文本内容
    public enum VisionType
    {
        [ComboBoxItemName("算法1")]
        One,
        [ComboBoxItemName("算法2")]
        Two,
        [ComboBoxItemName("算法3")]
        Three,
        [ComboBoxItemName("算法4")]
        Four,
    }
}
